// AO -> function 独立的仓库

// 对象
// function test(a,b){

// }
// 函数也是一种对象类型，也是一种引用类型 引用值
// 对象 -> 有些属性是我们无法访问的
       // JS引擎中内部的固有的隐式属性
// [[scope]]
    // 1. 函数创建时，生成的一个js内部的隐式属性
    // 2. 函数存储作用域链的容器，作用域链
    //     AO, 函数的执行期上下文
    //     GO, 全局的执行期上下文
    //     函数执行完成以后，AO是要销毁的
    //     AO是一个即时的存储容器  

    // function a(){
    //   function b(){
    //     var b = 2;
    //   }
    //   var a = 1;
    //   b()
    // }
    // var c = 3;
    // a()

// 函数定义时，继承作用域链
//在函数执行时，生成自己的AO 继承的AO GO 向下移一位， 变量会先从自己的ao开始查找，逐步向下直至GO
//函数被执行完后，自己的AO就销毁了，继承他的函数的执行期上下文也将被销毁

// 在全局执行的前一刻 GO -> 函数声明已经定义 也就是说在执行的前一刻已经被定义了

// 预编译过程  1. 找变量声明
//           2.找函数声明

// 闭包： 当内部函数返回到外部，则一定产生闭包
// function test1(){
//   let a = 100;
//   function add(){
//     a++;
//     console.log(a);
//   }
//   function reduce(){
//     a--;
//     console.log(a);
//   }
//   return [add,reduce]
// }

// let arr = test1()
// arr[0]();
// arr[1]();


// function sunSched(){
//   var sunSched = '';

//   var operation = {
//     setSched: function(thing){
//       sunSched = thing;
//     },
//     showSched: function(){
//       console.log('my schedule on sunday is'+ thing);
//     }
//   }
//   return operation;
// }

// var scale = sunSched()
// scale.setSched('studying')
// scale.showSched()